package com.lyb269.thread;

import org.junit.Test;


/**
 *  并发之,volatile线程可见性
 */
public class VolatileTest {


    @Test
    public void nonvolatileTest(){
        DataKey dataKey = new DataKey();
        //定义一个线程changeKeyThread 对,key的值进行修改
        new Thread("changeKeyThread"){
            @Override
            public void run() {
                System.out.println("线程:"+Thread.currentThread().getName()+" change key to " + dataKey.setKey());
            }
        }.start();
        //
        while (dataKey.key == 0){
            //死循环
        }
        System.out.println("while过了,说明当前执行的线程:"+Thread.currentThread().getName()+"可见到key的变化");
        // int key = 0; 加了 volatile,打印如下:
        //线程:changeKeyThread change key to 1
        //while死循环过了,说明当前执行的线程:main可见到key的变化
        //说明changeKeyThread线程对key的修改,main主线程是可见的


        // int key = 0; 没加volatile,打印如下:
        //线程:changeKeyThread change key to 1
        //然后进入while死循环了
        //说明changeKeyThread线程对key的修改,main主线程是不可见的

    }


    class DataKey {
        volatile int key = 0;
        int setKey(){
            this.key = 1;
            return key;
        }
    }
}
